STL源码分析:浅析string和vector的区别

您所在的位置:网站首页 string 和 char STL源码分析:浅析string和vector的区别

STL源码分析:浅析string和vector的区别

2023-08-18 16:21| 来源: 网络整理| 查看: 265

目录

前言

转换为C-style字符串

重载输入输出流操作符

重载+、+=操作符

前言

      为什么会关注string和vector的区别?

      先来说下string这个“类”。

      string和vector、list、deque等容器不一样,在STL中并不存在class string{...},它实际上是一个全局类型,通过typedef定义:

       也就是说,string实际上是通过basic_string类来实现的,而string则是模板类basic_string的char特例化版本,同样还有针对宽字节的wstring。

       然后看看basic_string类:

template class basic_string : private _String_base { ... size_type size() const { return _M_finish - _M_start; } size_type capacity() const { return (_M_end_of_storage - _M_start) - 1; } ... } /* string_base 类*/ template class _String_base { ... protected: typedef simple_alloc _Alloc_type; /*三个主要的成员*/ _Tp* _M_start; _Tp* _M_finish; _Tp* _M_end_of_storage; // Precondition: 0 < __n 0) { int __c1 = __buf->sbumpc(); //获取流中的字符 if (__c1 == EOF) { __is.clear(__is.rdstate() | ios::eofbit); break; } else { _CharT __c = _Traits::to_char_type(__c1); if (isspace((unsigned char) __c)) { ... } else __s.push_back(__c); //放入string中 } } ... } __is.width(0); } else ... return __is; }

       需要注意的是,对于重载输出流操作符,string是输出size()个元素,也就是说,不管string中存放的字符元素是什么,它都会将其输出,如果在string中存放的元素是{‘x’、'y'、'\0'、'z'},由于string的size是4,因此cout出来的结果就是"xy z",它并不会因为其中有一个终止符'\0'而不输出。这一点和C风格的char *字符串是不同的。

重载+、+=操作符

      vector并不能直接实现字符串的拼接,但是string可以,string中重载了+、+=运算符,以拼接两个字符串为例:

template inline basic_string operator+(const basic_string& __x, const basic_string& __y) //重载+ { typedef basic_string _Str; typedef typename _Str::_Reserve_t _Reserve_t; _Reserve_t __reserve; _Str __result(__reserve, __x.size() + __y.size(), __x.get_allocator()); //开辟一个新的string __result.append(__x); //向新的string中添加传入的两个参数 __result.append(__y); return __result; } basic_string& operator+=(const basic_string& __s) { return append(__s); } //重载+=

      对比+和+=,可以看到,+=只是在原来基础上append新的字符串,而+则是需要将参数的两个字符串全部拷贝到新的字符串中,因此,和p+=q相比,p = p + q会更加的耗时。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3